package com.zx.zxpicture.infrstructure.utils;

import lombok.Data;

import java.util.concurrent.*;

/**
 * 全局线程池工具类（单例模式）
 */
@Data
public class ExecutorPool {
    // 单例实例
    private static volatile ExecutorPool instance;
    // 线程池对象
    private final ThreadPoolExecutor executor;

    // 核心线程数 = CPU核心数
    private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();
    // 最大线程数 = 核心线程数 * 2
    private static final int MAX_POOL_SIZE = CORE_POOL_SIZE * 2;
    // 空闲线程存活时间（秒）
    private static final long KEEP_ALIVE_TIME = 60L;
    // 任务队列容量
    private static final int QUEUE_CAPACITY = 1000;

    /**
     * 私有构造方法（禁止外部实例化）
     */
    private ExecutorPool() {
        // 创建线程池
        executor = new ThreadPoolExecutor(
                CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                KEEP_ALIVE_TIME,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(QUEUE_CAPACITY),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时由主线程执行
        );
    }

    /**
     * 获取单例实例（双重校验锁保证线程安全）
     */
    public static ExecutorPool getInstance() {
        if (instance == null) {
            synchronized (ExecutorPool.class) {
                if (instance == null) {
                    instance = new ExecutorPool();
                }
            }
        }
        return instance;
    }

    /**
     * 提交异步任务（无返回值）
     */
    public void execute(Runnable task) {
        executor.execute(task);
    }

    /**
     * 提交异步任务（有返回值）
     */
    public <T> Future<T> submit(Callable<T> task) {
        return executor.submit(task);
    }

    /**
     * 关闭线程池（谨慎调用！）
     */
    public void shutdown() {
        if (!executor.isShutdown()) {
            executor.shutdown();
        }
    }

    /**
     * 带异常处理的任务包装（可选）
     */
    public static Runnable wrapTask(Runnable task) {
        return () -> {
            try {
                task.run();
            } catch (Exception e) {
                // 自定义异常处理逻辑
                System.err.println("任务执行异常: " + e.getMessage());
                e.printStackTrace();
            }
        };
    }
}